import requests
import argparse
import json

def query_ip_info(ip=None):
    """
    查询IP地址的归属地信息
    :param ip: 要查询的IP地址，默认为None（查询本机公网IP）
    :return: 包含查询结果的字典
    """
    base_url = "http://ip-api.com/json/"
    target_url = f"{base_url}{ip}" if ip else base_url.rstrip('/')
    
    try:
        response = requests.get(target_url, params={'fields': '66846719'})  # 请求所有可用字段
        response.raise_for_status()
        data = response.json()
        
        if data['status'] == 'fail':
            return {'error': data['message']}
        return data
    
    except requests.exceptions.RequestException as e:
        return {'error': f"网络请求错误: {str(e)}"}
    except json.JSONDecodeError:
        return {'error': "无效的API响应"}

def format_output(data):
    """格式化输出查询结果"""
    if 'error' in data:
        print(f"错误信息: {data['error']}")
        return

    # 中文字段映射
    fields = {
        'query': 'IP地址',
        'status': '状态',
        'country': '国家',
        'countryCode': '国家代码',
        'region': '地区代码',
        'regionName': '地区名称',
        'city': '城市',
        'zip': '邮编',
        'lat': '纬度',
        'lon': '经度',
        'timezone': '时区',
        'isp': 'ISP服务商',
        'org': '组织机构',
        'as': 'AS信息',
        'reverse': '反向解析',
        'mobile': '移动网络',
        'proxy': '代理',
        'hosting': '托管服务'
    }

    print("IP归属地查询结果：")
    for key, zh_name in fields.items():
        value = data.get(key, 'N/A')
        if key in ['lat', 'lon'] and value != 'N/A':
            value = f"{value:.4f}"
        print(f"{zh_name:>8}：{value}")

def main():
    parser = argparse.ArgumentParser(description="IP归属地查询工具")
    parser.add_argument('-i', '--ip', help="要查询的IP地址，不指定则查询本机公网IP")
    parser.add_argument('-j', '--json', action='store_true', help="显示完整JSON格式输出")
    args = parser.parse_args()

    result = query_ip_info(args.ip)
    
    if args.json:
        print(json.dumps(result, indent=2, ensure_ascii=False))
    else:
        format_output(result)

if __name__ == "__main__":
    main()